home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / wais / waisgate / HTWriter.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  4KB  |  190 lines

  1. /*        FILE WRITER            HTWrite.c
  2. **        ===========
  3. **
  4. */
  5. #include "HTWriter.h"
  6.  
  7. #define BUFFER_SIZE 4096    /* Tradeoff */
  8.  
  9. #include "HTUtils.h"
  10. #include "tcp.h"
  11. #include <stdio.h>
  12.  
  13.  
  14. /*        HTML Object
  15. **        -----------
  16. */
  17.  
  18. struct _HTStream {
  19.     CONST HTStreamClass *    isa;
  20.  
  21.     int    soc;
  22.     char    *write_pointer;
  23.     char     buffer[BUFFER_SIZE];
  24. #ifdef NOT_ASCII
  25.     BOOL    make_ascii;    /* Are we writing to the net? */
  26. #endif
  27. };
  28.  
  29.  
  30. /*    Write the buffer out to the socket
  31. **    ----------------------------------
  32. */
  33.  
  34. PRIVATE void flush ARGS1(HTStream *, me)
  35. {
  36.     char *read_pointer     = me->buffer;
  37.     char *write_pointer = me->write_pointer;
  38.  
  39. #ifdef NOT_ASCCII
  40.     if (me->make_ascii) {
  41.         char * p;
  42.     for(p = me->buffer; p < me->write_pointer; p++)
  43.         *p = TOASCII(*p);
  44.     }
  45. #endif
  46.     while (read_pointer < write_pointer) {
  47.         int status;
  48.     status = NETWRITE(me->soc, me->buffer,
  49.             write_pointer - read_pointer);
  50.     if (status<0) {
  51.         if(TRACE) fprintf(stderr,
  52.         "HTWrite: Error on socket output stream!!!\n");
  53.         return;
  54.     }
  55.     read_pointer = read_pointer + status;
  56.     }
  57.     me->write_pointer = me->buffer;
  58. }
  59.  
  60.  
  61. /*_________________________________________________________________________
  62. **
  63. **            A C T I O N     R O U T I N E S
  64. */
  65.  
  66. /*    Character handling
  67. **    ------------------
  68. */
  69.  
  70. PRIVATE void HTWriter_put_character ARGS2(HTStream *, me, char, c)
  71. {
  72.     if (me->write_pointer == &me->buffer[BUFFER_SIZE]) flush(me);
  73.     *me->write_pointer++ = c;
  74. }
  75.  
  76.  
  77.  
  78. /*    String handling
  79. **    ---------------
  80. **
  81. **    Strings must be smaller than this buffer size.
  82. */
  83. PRIVATE void HTWriter_put_string ARGS2(HTStream *, me, CONST char*, s)
  84. {
  85.     int l = strlen(s);
  86.     if (me->write_pointer + l > &me->buffer[BUFFER_SIZE]) flush(me);
  87.     strcpy(me->write_pointer, s);
  88.     me->write_pointer = me->write_pointer + l;
  89. }
  90.  
  91.  
  92. /*    Buffer write.  Buffers can (and should!) be big.
  93. **    ------------
  94. */
  95. PRIVATE void HTWriter_write ARGS3(HTStream *, me, CONST char*, s, int, l)
  96. {
  97.  
  98.     CONST char *read_pointer     = s;
  99.     CONST char *write_pointer = s+l;
  100.  
  101.     flush(me);        /* First get rid of our buffer */
  102.  
  103.     while (read_pointer < write_pointer) {
  104.         int status = NETWRITE(me->soc, read_pointer,
  105.             write_pointer - read_pointer);
  106.     if (status<0) {
  107.         if(TRACE) fprintf(stderr,
  108.         "HTWriter_write: Error on socket output stream!!!\n");
  109.         return;
  110.     }
  111.     read_pointer = read_pointer + status;
  112.     }
  113. }
  114.  
  115.  
  116.  
  117.  
  118. /*    Free an HTML object
  119. **    -------------------
  120. **
  121. **    Note that the SGML parsing context is freed, but the created object is not,
  122. **    as it takes on an existence of its own unless explicitly freed.
  123. */
  124. PRIVATE void HTWriter_free ARGS1(HTStream *, me)
  125. {
  126.     NETCLOSE(me->soc);
  127.     flush(me);
  128.     free(me);
  129. }
  130.  
  131. /*    End writing
  132. */
  133.  
  134. PRIVATE void HTWriter_end_document ARGS1(HTStream *, me)
  135. {
  136.     flush(me);
  137. }
  138.  
  139.  
  140.  
  141. /*    Structured Object Class
  142. **    -----------------------
  143. */
  144. PUBLIC CONST HTStreamClass HTWriter = /* As opposed to print etc */
  145. {        
  146.     "SocketWriter",
  147.     HTWriter_free,
  148.     HTWriter_end_document,
  149.     HTWriter_put_character,     HTWriter_put_string,
  150.     HTWriter_write
  151. }; 
  152.  
  153.  
  154. /*    Subclass-specific Methods
  155. **    -------------------------
  156. */
  157.  
  158. PUBLIC HTStream* HTWriter_new ARGS1(int, soc)
  159. {
  160.     HTStream* me = (HTStream*)malloc(sizeof(*me));
  161.     if (me == NULL) outofmem(__FILE__, "HTML_new");
  162.     me->isa = &HTWriter;       
  163.     
  164. #ifdef NOT_ASCII
  165.     me->make_ascii = NO;
  166. #endif    
  167.     me->soc = soc;
  168.     me->write_pointer = me->buffer;
  169.     return me;
  170. }
  171.  
  172. /*    Subclass-specific Methods
  173. **    -------------------------
  174. */
  175.  
  176. PUBLIC HTStream* HTASCIIWriter ARGS1(int, soc)
  177. {
  178.     HTStream* me = (HTStream*)malloc(sizeof(*me));
  179.     if (me == NULL) outofmem(__FILE__, "HTML_new");
  180.     me->isa = &HTWriter;       
  181.  
  182. #ifdef NOT_ASCII
  183.     me->make_ascii = YES;
  184. #endif    
  185.     me->soc = soc;
  186.     me->write_pointer = me->buffer;
  187.     return me;
  188. }
  189.  
  190.